package com.ideaaedi.zoo.diy.artifact.generator.properties.nested;

import com.alibaba.excel.annotation.ExcelProperty;
import com.google.common.collect.Lists;
import com.ideaaedi.zoo.diy.artifact.apidoc.knife4j.ZooKnife4jAutoConfiguration;
import com.ideaaedi.zoo.diy.artifact.generator.code.config.GeneratorMutableDefaultConfig;
import com.ideaaedi.zoo.diy.artifact.generator.properties.GeneratorDatabaseProperties;
import com.ideaaedi.zoo.diy.artifact.mybatisplus.injector.MybatisPlusSqlInjector;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.beans.BeanUtils;

import javax.annotation.Nullable;
import java.util.List;

/**
 * java curd代码生成器配置
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class JavaCurdCode extends GeneratorDatabaseProperties implements Cloneable {
    /**
     * 输出目录
     */
    @NotBlank
    private String outputDir = "./generator/java_code_curl";
    
    /**
     * 父包名（为空则自动取当前调用者的所在包）
     */
    @Nullable
    private String packagePath;
    
    /**
     * since
     * <pre>
     * 如果想获取动态日期，可以这么填，如：
     * yyyy-MM-dd
     * yyyy-MM-dd HH:mm:ss
     *
     * 如果想设置静态值，可以用引号引起来，如：
     * '1.0.0'
     * </pre>
     */
    @NotBlank
    private String javadocSince = "'1.0.0'";
    
    /**
     * 作者
     */
    @NotBlank
    private String javadocAuthor = DEFAULT_AUTHOR;
    
    /**
     * true-使用自定义模板; false-使用默认模板
     */
    private boolean useCustomTemplate = true;
    
    /**
     * 模板所在目录
     * <pre>
     * 注：只有当{@link #useCustomTemplate}为true时，此参数才生效
     */
    private String templateClasspathDir = "/templates/default-java-curd/";
    
    /**
     * 请求体基类全类名
     * <pre>
     * 注：只有当{@link #useCustomTemplate}为true时，此参数才生效
     * </pre>
     */
    private String baseDtoClassLongName = GeneratorMutableDefaultConfig.REQ_BASE_CLASS_LONG_NAME;
    
    /**
     * 分页请求体基类全类名
     * <pre>
     * 注：只有当{@link #useCustomTemplate}为true时，此参数才生效
     * </pre>
     */
    private String basePageDtoClassLongName = GeneratorMutableDefaultConfig.REQ_BASE_PAGE_CLASS_LONG_NAME;
    
    /**
     * 分页响应体全类名
     * <pre>
     * 注：只有当{@link #useCustomTemplate}为true时，此参数才生效
     * </pre>
     */
    private String pageInfoClassLongName = GeneratorMutableDefaultConfig.PAGE_INFO_CLASS_LONG_NAME;
    
    /**
     * 统一返回类全类名
     * <pre>
     * 注：只有当{@link #useCustomTemplate}为true时，此参数才生效
     * </pre>
     */
    private String resultClassLongName = GeneratorMutableDefaultConfig.RESULT_CLASS_LONG_NAME;
    
    /**
     * true-controller的返回模型用Result.success()包装; false-不包装
     * <pre>
     * 注：只有当{@link #useCustomTemplate}为true时，此参数才生效
     * </pre>
     */
    private boolean wrapControllerResult = true;
    
    /**
     * 是否在PojoListRespVO模型的字段上添加@ExcelProperty注解
     * <pre>
     * 注：只有当{@link #useCustomTemplate}=true && {@link  #existEasyExcel}=true时，此参数才生效
     * </pre>
     */
    private boolean ifAddExcelPropertyAnno = true;
    
    /**
     * 是否存在excel
     * <p>
     * 若值为空，则自动以应用中是否存在{@link ExcelProperty}类作依据进行推断
     * </p>
     */
    private Boolean existEasyExcel;
    
    /**
     * 是否存在mybatis-plus-ext
     * <p>
     * 若值为空，则自动以spring中是否存在{@link MybatisPlusSqlInjector}作依据进行推断
     * </p>
     */
    private Boolean existMybatisPlusExt;
    
    /**
     * 是否存在Knife4j-ext
     * <p>
     * 若值为空，则自动以spring中是否存在{@link ZooKnife4jAutoConfiguration}作依据进行推断
     * </p>
     */
    private Boolean existKnife4jExt;
    
    /**
     * 生成xxxAddReqVO时，需要忽略的字段名
     */
    private List<String> ignoreAddReqFields = Lists.newArrayList(
            "id", "tenant", "createdBy", "createdAt", "updatedBy", "updatedAt", "deleted"
    );
    
    /**
     * 生成xxxExcelImportReqVO时，需要忽略的字段名
     */
    private List<String> ignoreExcelImportReqFields = Lists.newArrayList(
            "id", "tenant", "createdBy", "createdAt", "updatedBy", "updatedAt", "deleted"
    );
    
    /**
     * 生成xxxDetailRespVO时，需要忽略的字段名
     */
    private List<String> ignoreDetailRespFields = Lists.newArrayList(
            "tenant", "createdBy", "updatedBy", "deleted"
    );
    
    /**
     * 生成xxxListReqVO时，需要忽略的字段名
     */
    private List<String> ignoreListReqFields = Lists.newArrayList(
            "id", "tenant", "createdBy", "createdAt", "updatedBy", "updatedAt", "deleted"
    );
    
    /**
     * 生成xxxListRespVO时，需要忽略的字段名
     */
    private List<String> ignoreListRespFields = Lists.newArrayList(
            "tenant", "createdBy", "createdAt", "updatedBy", "updatedAt", "deleted"
    );
    
    /**
     * 生成xxxUpdateReqVO时，需要忽略的字段名
     */
    private List<String> ignoreUpdateReqFields = Lists.newArrayList(
            "tenant", "createdBy", "createdAt", "updatedBy", "updatedAt", "deleted"
    );
    
    /**
     * 生成时，是否同时生成excel导入相关的接口、类等
     * <pre>
     * 注1：只有当{@link #useCustomTemplate}为true时，此参数才生效
     * 注2：生成的excel功能，会用到easyexcel
     * </pre>
     */
    private boolean containExcelImportRe = true;
    
    /**
     * excel导入原始动态模板
     * <pre>
     * 注1：只有当{@link #containExcelImportRe}生效时，此参数才生效
     * 注2：程序会使用此原始模板，动态生成excel导入模板
     * </pre>
     */
    @NotBlank(message = "excel-import-raw-excel-template cannot be blank.")
    private String excelImportRawExcelTemplate = "templates/default-java-curd/default-excel-import-template.origin.xlsx";
    
    @Override
    @SuppressWarnings("MethodDoesntCallSuperMethod")
    public JavaCurdCode clone() {
        JavaCurdCode clone = new JavaCurdCode();
        BeanUtils.copyProperties(this, clone);
        return clone;
    }
}
